/* @flow */

import { toArray } from '../util/index'
/**
 * Vue.use 的使用
 * @param {*} Vue
 * 如果你出传递进来的是plugins参数是一个对象，然后 Vue.use 会找到这个对象的install方法，作为入口调用
 * 第二种就是你传递进来的参数是一个函数，那么就会执行多个函数
 * 当install方法被同一个插件多次调用，插件将只会被安装一次
 */
export function initUse (Vue: GlobalAPI) {
  Vue.use = function (plugin: Function | Object) {
    const installedPlugins = (this._installedPlugins || (this._installedPlugins = []))
    if (installedPlugins.indexOf(plugin) > -1) {
      return this
    }

    // additional parameters
    const args = toArray(arguments, 1)
    args.unshift(this)
    // 如果有 install 就执行install
    if (typeof plugin.install === 'function') {
      plugin.install.apply(plugin, args)
    } else if (typeof plugin === 'function') {
      // 如果传递进来一个函数，就执行这个函数
      plugin.apply(null, args)
    }
    installedPlugins.push(plugin)
    return this
  }
}
